package com.example.demo4;

import lombok.Data;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

/**
 * 一个bean标签 可以有多个 property子标签,所以再定义一个 MutablePropertyValues
 * 类 用来存储并管理 多个 PropertyValue 对象
 *
 * 该类用来存储和遍历多个PropertyValue对象
 */
@Data
public class MutablePropertyValues implements Iterable<PropertyValue> {

    //定义list集合,存储PropertyValue的容器
    private final List<PropertyValue> propertyValues;

    // 空参构造, 初始propertyValues
    public MutablePropertyValues() {
        this.propertyValues = new ArrayList<>();
    }

    //有参构造 接收一个外部传入的list,赋值propertyValues属性
    public MutablePropertyValues(List<PropertyValue> propertyValues) {
        if (propertyValues == null) {
            this.propertyValues = new ArrayList<>();
        } else {
            this.propertyValues = propertyValues;
        }
    }


    //获取当前容器对应的迭代器对象
    @Override
    public Iterator<PropertyValue> iterator() {
        //直接获取List集合中的迭代器
        return propertyValues.iterator();
    }

    //获取所有的PropertyValue
    public PropertyValue[] getPropertyValues() {
        //将集合转换为数组 然后返回
        return propertyValues.toArray(new PropertyValue[0]);
    }

    //根据name属性值获取PropertyValue
    public PropertyValue getPropertyValue(String propertyName) {
        PropertyValue value = propertyValues.stream().filter(propertyValue -> propertyValue.getName().equals(propertyName)).findFirst().orElse(null);
        return value;
    }

    //判断集合是否为空
    public boolean isEmpty() {
        return propertyValues.isEmpty();
    }

    //向集合中添加
    //向集合中添加
    public MutablePropertyValues addPropertyValue(PropertyValue value) {
        //判断集合中存储的propertyvalue对象.是否重复,重复就进行覆盖
        for (int i = 0; i < propertyValues.size(); i++) {
            //获取集合中每一个 PropertyValue
            PropertyValue currentPv = propertyValues.get(i);

            //判断当前的pv的name属性 是否与传入的相同,如果相同就覆盖
            if (currentPv.getName().equals(value.getName())) {
                propertyValues.set(i, value);
                return this;
            }
        }

        //没有重复
        this.propertyValues.add(value);
        return this;  //目的是实现链式编程
    }

    //判断是否有指定的name属性对象
    public boolean contains(String propertyName) {
        return !Objects.isNull(getPropertyValue(propertyName));
    }
}
